通过 Jenkins 自动部署博客
什么是 Jenkins
Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
- Jenkins 功能包括:
- 持续的软件版本发布/测试项目。
- 监控外部调用执行的工作。
怎么实现自动化部署
主要通过 Jenkins + Github 仓库的 webhooks 实现。
大概原理就是 git push 源码至源码仓库时,github 源码仓库的 webhooks 发出请求告知 Jenkins 服务器,有代码推送,而后 Jenkins 的自动部署任务开始拉取源码仓库代码进行自动部署操作。
前置条件
服务器最低硬件要求:
- 256 MB 内存
- 1 GB 的驱动器空间(如果将 Jenkins 作为 Docker 容器运行,则建议至少 10 GB)
自行安装好 Java 环境,最好是 jdk1.5 以上的。
自行安装好 Jenkins,推荐安装 LTS 版本。(具体安装方法自行百度,此处不进行讲解)
注:记得开放对应端口。
如果是部署到 Jenkins,相同服务器记得配置对应权限:如文件的写入、读取等。
基础配置
在安装好 Jenkins 后,于浏览器输入访问地址,进行基础配置。
- 根据提示获取密码,输入后,等待初始化。

- 自定义 Jenkins 时,选择【安装推荐的插件】(如果不选择后面需要手动下载很多插件),而后等待插件安装。

- 创建第一个管理员账户。

- 配置 Jenkins URL,就是当前应用的访问地址。

- 配置好后,建议重启一次,让刚刚安装的【推荐插件】生效。
- 重启 Jenkins:于访问地址后拼接 restart (例如:http://localhost:8080/restart)。
- 重载 Jenkins 配置信息:于访问地址后拼接 reload (例如:http://localhost:8080/reload)。
- 停止 Jenkins 服务器:于访问地址后拼接 exit (例如:http://localhost:8080/exit)。
- 安装插件
进入页面后如果不是中文的话,检查下是否安装了插件 【Localization: Chinese (Simplified)】,基本上都是会自动安装的
安装 NodeJS(后面要用,必须要安装):【系统管理】——【插件管理】——【可选插件】——搜索【NodeJS】——【Download now and install after restart】
推荐插件(可选插件):【Safe Restart】,安装后可在菜单栏选择【Restart Safely】一键重启
插件都安装好后需要重启一次。
配置 NodeJS
配置 NodeJS:【系统管理】——【全局工具配置】——【NodeJS】—— 【新增 NodeJS】—— 选择 NodeJS 版本,建议跟本地开发版本一致,而后设置别名

配置 GitHub AccessToken
- 【settings】—— 【Developer settings】


- 【Personal access tokens】——【Generate new token】

- 配置 Token:
- 【Note】自定义名称,例如:Jenkins Token
- 【Expiration】选择选择【No expiration】
- 勾选【repo】、【admin:org_hook】
- 而后选择【Generate token】

- 复制 Token 并记录,后面需要用于 Jenkins,该 Token 只明文显示一次!!!

配置 Jenkins 凭证
- 【系统管理】——【Manage Credentials】

- 选择【全局】——【添加凭证】


- 新建 Secret 凭证:类型选择【Secret text】,【Secret】输入刚刚在 Git 配置的 Token

- 新建 GitHub 登录凭证:类型选择【Username with password】,用户名输入 Git 的用户名,勾选【Treat username as secret】,【密码】输入刚刚在 Git 配置的 Token

配置 GitHub 服务器
- 【系统管理】——【系统配置】——【GitHub】——【Github 服务器】——【添加 Github 服务器】——【Github Server】

- 配置信息,而后点击测试

- 测试提示:Credentials verified for user 用户名, rate limit 代表配置成功

- 复制 Hook 地址: 选择【高级】—— 勾选【为 Github 指定另外一个 Hook URL】—— 复制 【Hook URL】——【应用】——【保存】


- 于 Github 源码仓库配置 Webhooks:【Settings】——【Webhooks】——【Add webhook】

- 新建 webhook。配置成功后,源码仓库 push 提交时,Jenkins 就可以监听到了。

配置 Git plugin
【系统管理】——【系统配置】——【Git plugin】—— 配置 user.name 跟 user.email(等等会用到的)——【应用】——【保存】

新建 Jenkins 任务
- 【新建任务】—— 输入任务名称,任务名称建议小写 ——【构建一个自由风格的软件项目】

- 【源码管理】——【Git】—— 配置

- 上图【新增】选择【Custom user name/e-mail address】 ,而后为空!!!不用填写对应 key!!!


- 【构建触发器】—— 勾选【GitHub hook trigger for GITScm polling】,用于监听 hook。

- 【构建环境】—— 勾选【Use secret text(s) or file(s)】—— 【新增】——【Secret text】—— 选择凭证、设置别名为 token,后面要用到。


- 【构建环境】—— 勾选【Provide Node & npm bin/ folder to PATH】—— 选择刚刚配置的 NodeJS 版本

- 【构建】——【新增构建步骤】——【执行 shell】
# 进入Jenkins工作空间下的项目目录。
# 工作空间可以从【系统设置】—【系统配置】—【主目录】获取。我这里是 /home/springboot/.jenkins
# 项目目录在工作空间下的 workspace 文件夹内,blog是当前的任务名称
cd /home/springboot/.jenkins/workspace/blog
# 获取 node 版本,可选
node -v
# 获取 npm 版本,可选
npm -v
# 把 npm 源设置为淘宝源
npm config set registry https://registry.npm.taobao.org
# 检测 npm 是否成功切换,可选
npm config get registry
# 安装依赖
npm install
# 打包
npm run build
# 打开打包后的文件夹,dist为默认打包文件夹名称
cd dist
- 部署到 Github Pages:需要额外添加以下代码,进行 Git push 操作
git init
git add -A
# 这里的 $GIT_AUTHOR_NAME、$GIT_AUTHOR_EMAIL 就是我们刚刚配置的全局变量,配置局部 git config 信息
# 一定要配置第三步的【Custom user name/e-mail address】,不然取不到全局变量
# 不配置局部 git config 的话,就不能进行 git commit 操作
git config user.name $GIT_AUTHOR_NAME
git config user.email $GIT_AUTHOR_EMAIL
# 如果是发布到自定义域名,可选
echo '你的域名' > CNAME
# 提交 commit,"$(date +"%Y-%m-%d %H:%M:%S")" 为当前服务器时间,根据自己需求修改
git commit -m "$(date +"%Y-%m-%d %H:%M:%S")"
# 自2021年8月13日起,GitHub 不再支持使用密码 push 的方式,所以我们要使用刚刚配置的 Personal access token 用于 push
# 取 https 仓库地址,格式为:https://$token@你的仓库地址,例如 https://$token@github.com/demo/demo.git
# $token 是刚刚配置的变量
git push -f https://$token@你的仓库地址 master
- 部署到当前服务器:需要文件夹的读入、写入等权限
# 把生成的项目文件打包成压缩包,方便操作。blog 是压缩文件名称
tar -zcvf blog.tar.gz *
# 进入 web 项目目录,/www/wwwroot 为自己当前服务器项目目录,blog 为当前要部署的项目目录,名称自定义(如果没有就要新建,不然会报错)
cd /www/wwwroot/blog
# 将打包好的压缩包,复制到 web 项目目录
cp -r /home/springboot/.jenkins/workspace/blog/dist/blog.tar.gz ./
# 解压项目到项目目录
tar -zxvf blog.tar.gz -C ./
# 删除压缩包,可选
rm -rf blog.tar.gz